package org.zjx.core.builder;

import org.zjx.core.GameAction;
import org.zjx.exception.ActionValidationException;
import org.zjx.exception.DecisionException;

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

/**
 * 简单游戏动作实现 - GameAction接口的基础实现
 *
 * 提供基本的动作ID和参数管理功能，适合大多数不需要复杂逻辑的游戏动作。
 */
public class SimpleGameAction implements GameAction {
    private final String actionId;
    private final Map<String, Object> params;

    /**
     * 构造函数
     * @param actionId 动作唯一标识符
     * @param params 动作参数映射
     */
    public SimpleGameAction(String actionId, Map<String, Object> params) {
        if (actionId == null || actionId.trim().isEmpty()) {
            throw new IllegalArgumentException("Action ID cannot be null or empty");
        }
        this.actionId = actionId;
        this.params = params != null ? new HashMap<>(params) : new HashMap<>();
    }
    @Override
    public void execute() {

    }
    /**
     * 获取动作ID
     * @return 动作唯一标识符
     */
    @Override
    public String getActionId() {
        return actionId;
    }

    /**
     * 获取动作参数
     * @return 不可修改的参数映射视图
     */
    @Override
    public Map<String, Object> getParams() {
        return Collections.unmodifiableMap(params);
    }

    /**
     * 验证动作有效性
     *
     * 默认实现检查：
     * 1. 动作ID不为空
     * 2. 参数映射不为null
     *
     * @throws ActionValidationException 如果验证失败
     */
    @Override
    public void validate() throws ActionValidationException {
        if (actionId == null || actionId.trim().isEmpty()) {
            throw new ActionValidationException("INVALID_ACTION_ID", this, "Action ID is required");
        }
        if (params == null) {
            throw new ActionValidationException("NULL_PARAMS", this, "Action parameters cannot be null");
        }
    }

    /**
     * 获取参数值
     * @param key 参数键
     * @return 参数值，如果不存在返回null
     */
    public Object getParam(String key) {
        return params.get(key);
    }

    /**
     * 获取参数值(带默认值)
     * @param key 参数键
     * @param defaultValue 默认值
     * @return 参数值或默认值
     */
    public Object getParam(String key, Object defaultValue) {
        return params.getOrDefault(key, defaultValue);
    }

    /**
     * 设置参数
     * @param key 参数键
     * @param value 参数值
     */
    public void setParam(String key, Object value) {
        params.put(key, value);
    }

    @Override
    public String toString() {
        return "SimpleGameAction{" +
                "actionId='" + actionId + '\'' +
                ", params=" + params +
                '}';
    }
}